import re 
import tkinter
import tkinter.messagebox

root = tkinter.Tk()
#
root.geometry('300x200+400+100')
#
root.resizable(False, False)
#
root.title('简易计算器')
 
#
contentVar = tkinter.StringVar(root, '')
contentEntry = tkinter.Entry(root, textvariable=contentVar)
contentEntry['state'] = 'readonly'
contentEntry.place(x=10, y=10, width=280, height=20)

#
def buttonClick(btn):
    content = contentVar.get()
    #
    if content.startswith('.'):
        content = '0' + content

    #
    if btn in '0123456789':
        content += btn
    elif btn == '.':
        #
        lastpart = re.split(r'\+|-|\*|/]', content)[1]
        if '.' in lastpart:
            tkinter.messagebox.showerror('错误', '小数点太多了')
            return
        else:
            content += btn
    elif btn == 'C':
        #
        content = ''
    elif btn == '=':
        try:
            #
            content = str(eval(content))
        except:
            tkinter.messagebox.showerror('错误', '表达式有误')
            return
    elif btn in operators:
        if content.endswith(operators):
            tkinter.messagebox.showerror('错误',
                                            '不允许存在连续运算符')
            return
        content += btn

    contentVar.set(content)

#
btnClear = tkinter.Button(root,
                            text='Clear',
                            command=lambda:buttonClick('C'))
btnClear.place(x=40, y=40, width=80, height=20)
btnCompute = tkinter.Button(root,
                               text='=',
                               command=lambda:buttonClick('='))
btnCompute.place(x=170, y=40, width=80, height=20)

#
digits = list('0123456789.') + ['Sqrt']
index = 0
for row in range(4):
    for col in range(3):
        d = digits[index]
        index += 1
        btnDigit = tkinter.Button(root,
                                    text=d,
command=lambda x=d:buttonClick(x))
        btnDigit.place(x=20+col*70,
                         y=80+row*50,
                             width=50, 
                             height=20)
        
#
operators = ('+', '-', '*', '/', '**', '//')
for index, operator in enumerate(operators):
    btnOperator = tkinter.Button(root,
                                    text=operator,
                           command=lambda x=operator:buttonClick(x))
    btnOperator.place(x=230, y=80+index*30, width=50, height=20)

root.mainloop()
